home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / gfx / misc / phoon.lha / amiga.c next >
C/C++ Source or Header  |  1992-09-14  |  4KB  |  165 lines

  1. /*
  2.  *  amiga.c
  3.  *
  4.  *  Author: Tomi Ollila <too@cs.hut.fi>
  5.  *
  6.  *  Created: Sun Jul 05 15:30:58 1992 too
  7.  *  Last modified: Mon Sep 14 00:58:34 1992 too
  8.  *
  9.  */
  10.  
  11. #include <exec/types.h>
  12. #include <intuition/intuition.h>
  13. #include "iff.h"
  14.  
  15. #include <inline/stubs.h>
  16. #include <inline/exec.h>
  17. #include <inline/intuition.h>
  18. #include <inline/graphics.h>
  19. #include "inline_iff.h"
  20.  
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include "amiga.h"
  24.  
  25. #ifndef NULL
  26. #define NULL 0
  27. #endif
  28.  
  29. #define WRITERR(msg) write(2, msg, strlen(msg))
  30.  
  31. struct IntuitionBase *IntuitionBase = NULL;
  32. struct GfxBase         *GfxBase = NULL;
  33. struct Library         *IFFBase = NULL;
  34.  
  35. void am_OpenLibraries(void)
  36. {
  37.   if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",
  38.                            33)) == NULL) {
  39.     WRITERR("Could not open Intuition library\n");
  40.     am_CloseLibraries();
  41.     exit(0);
  42.   }
  43.   if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",
  44.                            33)) == NULL) {
  45.     WRITERR("Could not open Graphics library\n");
  46.     am_CloseLibraries();
  47.     exit(0);
  48.   }
  49.   if ((IFFBase = (struct Library *)OpenLibrary("iff.library",
  50.                            22L)) == NULL) {
  51.     WRITERR("Could not open IFF library\n");
  52.     am_CloseLibraries();
  53.     exit(0);
  54.   }
  55. }
  56.  
  57. void am_CloseLibraries()
  58. {
  59.   if (IntuitionBase)  CloseLibrary(IntuitionBase);
  60.   if (GfxBase) CloseLibrary(GfxBase);
  61.   if (IFFBase) CloseLibrary(IFFBase);
  62. }
  63.  
  64. void am_GetScreenSize(w, h)
  65. int * w;
  66. int * h;
  67. {
  68.   struct Screen screen;
  69.  
  70.   if (GetScreenData((APTR)&screen, sizeof(struct Screen),
  71.             WBENCHSCREEN, NULL) == NULL) {
  72.     WRITERR("Could not figure out screensize.\n");
  73.     am_CloseLibraries();
  74.     exit(0);
  75.   }
  76.   *w = screen.Width;
  77.   *h = screen.Height;
  78. }
  79.  
  80. /* Memory for bitmaps is longword aligned so we can use longword copy. */
  81. #define BitmapSize(w,h) (((((w) + 31) / 32) * 4) * (h))
  82.  
  83. char * am_LoadFullmoon(w, h, filename)
  84.      int  *    w;
  85.      int  *    h;
  86.      char *    filename;
  87. {
  88.   PLANEPTR    plane;
  89.   IFFL_HANDLE    iffhandle;
  90.   struct BitMap bitmap;
  91.   struct IFFL_BMHD *bmhd;
  92.   int size;
  93.  
  94.   if (filename == NULL)
  95.     filename = "fullmoon.ilbm\0                                              ";
  96.  
  97.   if ((iffhandle = IFFL_OpenIFF(filename, IFFL_MODE_READ)) == NULL) {
  98.     WRITERR("Error: Could not open ");
  99.     WRITERR(filename);
  100.     WRITERR(" for reading as fullmoon picture\n");
  101.     am_CloseLibraries();
  102.     exit(0);
  103.   }
  104.   if ((bmhd = IFFL_GetBMHD(iffhandle)) == NULL) {
  105.     WRITERR("Error: no BMHD chunk in ");
  106.     WRITERR(filename);
  107.     WRITERR("\n");
  108.     am_CloseLibraries();
  109.     exit(0);
  110.   }
  111.   *w = (int)bmhd->w; *h = (int)bmhd->h;
  112.   size = BitmapSize(*w, *h);
  113.  
  114.   if ((plane = (PLANEPTR)malloc(size)) == NULL) {
  115.     WRITERR("Out of memory\n");
  116.     am_CloseLibraries();
  117.     exit(0);
  118.   }
  119.   InitBitMap(&bitmap, 1, *w, *h);
  120.   bitmap.Planes[0] = plane;
  121.  
  122.   if (IFFL_DecodePic(iffhandle, &bitmap) == FALSE) {
  123.     WRITERR("Error: Could not decode IFF picture\n");
  124.     IFFL_CloseIFF(iffhandle);
  125.     am_CloseLibraries();
  126.     exit(0);
  127.   }
  128.  
  129.   IFFL_CloseIFF(iffhandle);
  130.   return (char *)plane;
  131. }
  132.  
  133. static UWORD colortable[] = {0xaaa, 0x000, 0xfff, 0x68b};
  134.  
  135. void am_MakeIFFile(w, h, bits, reverseflag)
  136. int    w;
  137. int    h;
  138. char *    bits;
  139. int    reverseflag;
  140. {
  141.   struct BitMap bitmap;
  142.   LONG        size;
  143.   ULONG     *plane1, *plane0;
  144.   int        i;
  145.  
  146.   InitBitMap(&bitmap, 2, w, h);
  147.   size = BitmapSize(w, h);
  148.   plane0 = (ULONG *)bits;
  149.  
  150.   if ((plane1 = (ULONG *)malloc(size)) == NULL) {
  151.     am_CloseLibraries();
  152.     WRITERR("Out of memory\n");
  153.     exit(0);
  154.   }
  155.   bitmap.Planes[reverseflag] = (PLANEPTR)plane1;
  156.   bitmap.Planes[(reverseflag + 1) & 1] = (PLANEPTR)plane0;
  157.  
  158.   size >>= 2;
  159.   for (i = 0; i < size; i++)
  160.     plane1[i] = plane0[i] ^ 0xffffffff;
  161.  
  162.   (void)IFFL_SaveBitMap("RAM:phoon.ilbm", &bitmap, colortable, 0);
  163.   free(plane1);
  164. }
  165.